//
//  ErrorShowViewController.swift
//  SwiftRx研究
//
//  Created by 世霖 on 2020/7/16.
//  Copyright © 2020 世霖. All rights reserved.
//

import UIKit
import RxSwift
import RxCocoa

enum MyError:Error {
     case A
    case B
}

class ErrorShowViewController: UIViewController {

    let dispaseBag = DisposeBag()
    let sequenceThatFails = PublishSubject<String>()
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
        sequenceThatFails
        .catchErrorJustReturn("cucu")
            .subscribe(onNext: { (event ) in
                print(event )
            })
        .disposed(by: dispaseBag)
        
        
//        catchError
//        该方法可以捕获error ，并进行处理
        let sequenceThatFailsss = PublishSubject<String>()
        let recoverySequencee = Observable.of("1", "2", "3")
        sequenceThatFailsss.catchError { (error) -> Observable<String> in
            print(error)
            return recoverySequencee
        }
        .subscribe(onNext:{print($0)})
    .disposed(by: dispaseBag)
        
        var count = 1
       
        let sequenceThatErrors = Observable<String>.create{ observer in
            observer.onNext("a")
             
            
            if count == 1 {
                observer.onError(MyError.A)
                print("Error encountered")
                count += 1
                }
            observer.onNext("c")
            return Disposables.create()
            
            
        }
    
        sequenceThatErrors.retry(2)
            .subscribe(onNext:{
                print($0)
            })
        .disposed(by: dispaseBag)
        
//        Debug
        Observable.of(2 , 3)
        .startWith(1)
        .debug("调试一")
            .subscribe { (event      ) in
                print(event)
        }
    .disposed(by: dispaseBag)
    
//    debug() 方法还可以传入标记参数，这样当项目中存在多个 debug 时可以很方便地区分出来。
    
//        RXSwift.Resources.total
        
//        通过将RXSwift.Resources.total
//        print(RxSwift.Reces)
        
//  还有Observable RxSwift还为我们提供了特征序列
//        Traits: single completable , maybe , Driver , ComtrolEvent
//        可以处理Observable的另外一个版本，他们之间存在联系
// Observable 能够用于任何上下文环境
//        Single 是Observable的另外一个版本，
//        不能共享状态变化
        
//        Single是比较常见的HTTP请求
        
        
        
    
    }

    func getPlayList(_ channel: String) -> Single<[String : Any]> {
        return Single<[String:Any]>.create{ single in
            let url = ""
            let task = URLSession.shared.dataTask(with: URL(string: url )!) {data ,_,error  in
//                let error  = error {
//                    single(.error(error ))
//                    return
//                }
                
            }
            
            return Disposables.create()
            
        }
     
//        Completable Completable 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素，它要么只能产生一个 completed 事件，要么产生一个 error 事件。
//
//不会发出任何元素
//只会发出一个 completed 事件或者一个 error 事件
//不会共享状态变化


        
//        这两个应该算是 RxCocoa traits，因为它们是专门服务于 RxCocoa工程的。
        
//如果fetch发送错误，产生绑定
//        ControlProperty 是专门用来描述 UI 控件属性，拥有该类型的属性都是被观察者（Observable）。
        
        
//        调度器（Schedulers）是 RxSwift 实现多线程的核心模块，它主要用于控制任务在哪个线程或队列运行。

//调度器（Schedulers） 度器（Schedulers）是 RxSwift 实现多线程的核心模块，它主要用于控制任务在哪个线程或队列运行。
        
//        方法决定数据序列的构建函数在哪个 Scheduler 上运行。
//        比如上面样例，由于获取数据、解析数据需要花费一段时间的时间，所以通过 subscribeOn 将其切换到后台 Scheduler 来执行。这样可以避免主线程被阻塞


        
    }
    
    
    
    
}
